import type { AxiosError, InternalAxiosRequestConfig } from 'axios'
import { message } from 'ant-design-vue'

import axios from 'axios'

// 这里是用于设定请求后端时，所用的 Token KEY
// 可以根据自己的需要修改，常见的如 Access-Token，Authorization
// 需要注意的是，请尽量保证使用中横线`-` 来作为分隔符，
// 避免被 nginx 等负载均衡器丢弃了自定义的请求头
export const REQUEST_TOKEN_KEY = 'Authorization'

export const STORAGE_TOKEN_KEY = 'access_token'

// 获取接口 API URL
export function getApiURL() {
  return window.location.host.toLowerCase() === 'zhixin.91goodschool.com'
    ? 'https://zhixinapi.91goodschool.com'
    : window.location.host.toLowerCase() === 'cszhixin.91goodschool.com'
      ? 'https://cszhixinapi.91goodschool.com'
      : import.meta.env.VITE_APP_API_BASE_URL
}

// 获取上传接口 API URL
export function getUploadApiURL() {
  return window.location.host.toLowerCase() === 'zhixin.91goodschool.com'
    ? 'https://zhixinuploadapi.91goodschool.com'
    : window.location.host.toLowerCase() === 'cszhixin.91goodschool.com'
      ? 'https://cszhixinuploadapi.91goodschool.com'
      : import.meta.env.VITE_APP_API_UPLOAD_URL
}

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  baseURL: getApiURL(),
  timeout: 6000 * 10, // 请求超时时间
})

// 创建 axios 实例
const requestUpload = axios.create({
  // API 请求的默认前缀
  baseURL: getUploadApiURL(),
  timeout: 6000 * 100, // 请求超时时间
})

export type RequestError = AxiosError<{
  message?: string
  result?: any
  errorMessage?: string
}>

export interface HttpResponse<T = any> {
  /**
   * 0 表示成功 其他表示失败
   * 0 means success, others means fail
   */
  code: number
  success: boolean
  data: T
  message: string
}

// 异常拦截处理器
function errorHandler(error: RequestError): Promise<any> {
  if (error.response) {
    const { data = {}, status } = error.response
    // 403 无权限
    if (status === 403) {
      message.error((data && data.message) || '你没有操作权限')
    }

    // 401 未登录/未授权
    if (status === 401 && data.result && data.result.isLogin) {
      message.error('请先登录')
      localStorage.removeItem(STORAGE_TOKEN_KEY)
      location.replace('/login')
    }

    if (error.response?.data?.message) {
      message.error(error.response.data.message)
    }
  }

  console.error('Request error:', error)
  return Promise.reject(error)
}

// 请求拦截器
function requestHandler(
  config: InternalAxiosRequestConfig,
): InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig> {
  const savedToken = localStorage.getItem(STORAGE_TOKEN_KEY)
  // 如果 token 存在
  // 让每个请求携带自定义 token, 请根据实际情况修改
  if (savedToken)
    config.headers[REQUEST_TOKEN_KEY] = `Bearer ${savedToken}`

  return config
}

// Add a request interceptor
request.interceptors.request.use(requestHandler, errorHandler)

// 响应拦截器
function responseHandler(response: { data: HttpResponse }) {
  if (response.data.success) {
    return response.data.data
  }

  if (response.data.message) {
    message.error(response.data.message)
  }

  // 如果是 blob 类型直接返回
  if (response.data instanceof Blob) {
    return response.data
  }

  console.error('Request error:', response.data)

  throw new Error(`Error ${response?.data?.message || '操作失败'} `)
}

// Add a response interceptor
request.interceptors.response.use(responseHandler, errorHandler)

requestUpload.interceptors.request.use(requestHandler, errorHandler)
requestUpload.interceptors.response.use(responseHandler, errorHandler)

export default request

export { requestUpload }
